package com.sky.orangehireserver.modules.admin.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sky.orangehireserver.aspect.ApiOperationLog;
import com.sky.orangehireserver.modules.admin.dto.EnterpriseUserCreateDTO;
import com.sky.orangehireserver.modules.admin.dto.EnterpriseUserPasswordResetDTO;
import com.sky.orangehireserver.modules.admin.dto.EnterpriseUserQueryDTO;
import com.sky.orangehireserver.modules.admin.dto.EnterpriseUserUpdateDTO;
import com.sky.orangehireserver.modules.admin.service.AdminEnterpriseUserService;
import com.sky.orangehireserver.modules.admin.vo.EnterpriseUserVO;
import com.sky.orangehireserver.utils.Response;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 超级管理员企业用户管理控制器
 * 
 * @author sky
 */
@Slf4j
@RestController
@RequestMapping("/admin/enterprise-users")
@RequiredArgsConstructor
@Tag(name = "超级管理员端-企业用户管理", description = "超级管理员端-企业用户管理相关接口")
public class AdminEnterpriseUserController {

    private final AdminEnterpriseUserService adminEnterpriseUserService;

    /**
     * 创建企业用户
     * 
     * @param createDTO 企业用户创建请求DTO
     * @return 企业用户信息VO
     */
    @PostMapping
    @Operation(summary = "创建企业用户", description = "超级管理员创建企业用户（企业管理员或企业HR）")
    @ApiOperationLog(description = "创建企业用户")
    public Response<EnterpriseUserVO> createEnterpriseUser(@Valid @RequestBody EnterpriseUserCreateDTO createDTO) {
        EnterpriseUserVO userVO = adminEnterpriseUserService.createEnterpriseUser(createDTO);
        return Response.success(userVO);
    }

    /**
     * 更新企业用户信息
     * 
     * @param updateDTO 企业用户更新请求DTO
     * @return 企业用户信息VO
     */
    @PutMapping
    @Operation(summary = "更新企业用户信息", description = "超级管理员更新企业用户信息")
    @ApiOperationLog(description = "更新企业用户信息")
    public Response<EnterpriseUserVO> updateEnterpriseUser(@Valid @RequestBody EnterpriseUserUpdateDTO updateDTO) {
        EnterpriseUserVO userVO = adminEnterpriseUserService.updateEnterpriseUser(updateDTO);
        return Response.success(userVO);
    }

    /**
     * 删除企业用户
     * 
     * @param id 用户ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    @Operation(summary = "删除企业用户", description = "超级管理员删除企业用户")
    @ApiOperationLog(description = "删除企业用户")
    public Response<Void> deleteEnterpriseUser(@Parameter(description = "用户ID") @PathVariable Long id) {
        adminEnterpriseUserService.deleteEnterpriseUser(id);
        return Response.success();
    }

    /**
     * 获取企业用户详情
     * 
     * @param id 用户ID
     * @return 企业用户信息VO
     */
    @GetMapping("/{id}")
    @Operation(summary = "获取企业用户详情", description = "根据ID获取企业用户详细信息")
    @ApiOperationLog(description = "获取企业用户详情")
    public Response<EnterpriseUserVO> getEnterpriseUserById(@Parameter(description = "用户ID") @PathVariable Long id) {
        EnterpriseUserVO userVO = adminEnterpriseUserService.getEnterpriseUserById(id);
        return Response.success(userVO);
    }

    /**
     * 分页查询企业用户列表
     * 
     * @param queryDTO 查询条件DTO
     * @return 分页企业用户信息
     */
    @GetMapping("/page")
    @Operation(summary = "分页查询企业用户列表", description = "根据条件分页查询企业用户列表")
    @ApiOperationLog(description = "分页查询企业用户列表")
    public Response<IPage<EnterpriseUserVO>> getEnterpriseUserPage(@Valid EnterpriseUserQueryDTO queryDTO) {
        IPage<EnterpriseUserVO> userPage = adminEnterpriseUserService.getEnterpriseUserPage(queryDTO);
        return Response.success(userPage);
    }

    /**
     * 根据企业ID获取企业用户列表
     * 
     * @param orgId 企业ID
     * @return 企业用户信息列表
     */
    @GetMapping("/organization/{orgId}")
    @Operation(summary = "根据企业ID获取企业用户列表", description = "获取指定企业下的所有用户")
    @ApiOperationLog(description = "根据企业ID获取企业用户列表")
    public Response<List<EnterpriseUserVO>> getEnterpriseUsersByOrgId(@Parameter(description = "企业ID") @PathVariable Long orgId) {
        List<EnterpriseUserVO> users = adminEnterpriseUserService.getEnterpriseUsersByOrgId(orgId);
        return Response.success(users);
    }

    /**
     * 启用企业用户
     * 
     * @param id 用户ID
     * @return 操作结果
     */
    @PutMapping("/{id}/enable")
    @Operation(summary = "启用企业用户", description = "启用指定企业用户")
    @ApiOperationLog(description = "启用企业用户")
    public Response<Void> enableEnterpriseUser(@Parameter(description = "用户ID") @PathVariable Long id) {
        adminEnterpriseUserService.enableEnterpriseUser(id);
        return Response.success();
    }

    /**
     * 禁用企业用户
     * 
     * @param id 用户ID
     * @return 操作结果
     */
    @PutMapping("/{id}/disable")
    @Operation(summary = "禁用企业用户", description = "禁用指定企业用户")
    @ApiOperationLog(description = "禁用企业用户")
    public Response<Void> disableEnterpriseUser(@Parameter(description = "用户ID") @PathVariable Long id) {
        adminEnterpriseUserService.disableEnterpriseUser(id);
        return Response.success();
    }

    /**
     * 重置企业用户密码
     * 
     * @param resetDTO 密码重置请求DTO
     * @return 操作结果
     */
    @PutMapping("/reset-password")
    @Operation(summary = "重置企业用户密码", description = "超级管理员重置企业用户密码")
    @ApiOperationLog(description = "重置企业用户密码")
    public Response<Void> resetEnterpriseUserPassword(@Valid @RequestBody EnterpriseUserPasswordResetDTO resetDTO) {
        adminEnterpriseUserService.resetEnterpriseUserPassword(resetDTO);
        return Response.success();
    }

    /**
     * 批量删除企业用户
     * 
     * @param ids 用户ID列表
     * @return 操作结果
     */
    @DeleteMapping("/batch")
    @Operation(summary = "批量删除企业用户", description = "批量删除多个企业用户")
    @ApiOperationLog(description = "批量删除企业用户")
    public Response<Void> batchDeleteEnterpriseUsers(@Parameter(description = "用户ID列表") @RequestBody List<Long> ids) {
        adminEnterpriseUserService.batchDeleteEnterpriseUsers(ids);
        return Response.success();
    }
}
